package StructuralPattern.Decorator;

/**
 * @Classname : Decorator
 * @Description : 测试 装饰者模式
 * 行为型-装饰者模式
 * 一、模式定义
 *   Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.
 *   动态地给一个对象添加一些额外的职责。就增加功能来说，装饰模式相比生成子类更为灵活。
 *   缺点：多层装饰会增加系统复杂度，当里层装饰出现问题时难以维护。
 * 二、模式类图
 *   https://kdocs.cn/l/cb2JcvO8FLRy
 * 三、适用场景
 *   1、希望动态灵活地扩展一个实现类的功能时
 * 四、应用举例
 *   1、IO输入流和输出流
 *
 * @Author : chentianyu
 * @Date 2023/2/15 23:30
 */


public class DecoratorClient {
    public static void main(String[] args) {
        Car car = new ConcreteCar();
        System.out.println("具体汽车运行");
        car.run();
        System.out.println("--------------------------------------------------------------------");

        System.out.println("具体装饰汽车（飞行）运行");
        Car flyCar = new FlyCarDecorator(car);
        flyCar.run();
        System.out.println("--------------------------------------------------------------------");

        System.out.println("具体装饰汽车（游泳）运行");
        Car swimCar = new SwimCarDecorator(car);
        swimCar.run();
        System.out.println("--------------------------------------------------------------------");

        System.out.println("具体装饰汽车（飞行+游泳）运行");
        Car superCar = new SwimCarDecorator(new FlyCarDecorator(new ConcreteCar()));
        superCar.run();
        System.out.println("--------------------------------------------------------------------");
    }
}

/** 20230215
 * 具体汽车运行
 * 地上行
 * --------------------------------------------------------------------
 * 具体装饰汽车（飞行）运行
 * 地上行
 * 天上飞
 * --------------------------------------------------------------------
 * 具体装饰汽车（游泳）运行
 * 地上行
 * 水里游
 * --------------------------------------------------------------------
 * 具体装饰汽车（飞行+游泳）运行
 * 地上行
 * 天上飞
 * 水里游
 * --------------------------------------------------------------------
 */
